home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / benchmarks / itc / gcc / varargs-spur.h < prev    next >
Encoding:
C/C++ Source or Header  |  1989-08-30  |  1013 b   |  39 lines

  1. /*  varargs.h for SPUR */
  2.  
  3. /* NB.  This is NOT the definition needed for the new ANSI proposed
  4.    standard */
  5.  
  6.  
  7. struct va_struct { char regs[20]; };
  8.  
  9. #define va_alist va_regs, va_stack
  10.  
  11. #define va_dcl struct va_struct va_regs; int va_stack;
  12.  
  13. typedef int va_list;
  14.  
  15. #define va_start(pvar) ((pvar) = 0)
  16.  
  17. #define va_arg(pvar,type)  \
  18.     ({  type va_result; \
  19.         if ((pvar) >= 20) { \
  20.            va_result = *( (type *) (&va_stack + ((pvar) - 20)/4)); \
  21.        (pvar) += (sizeof(type) + 7) & ~7; \
  22.     } \
  23.     else if ((pvar) + sizeof(type) > 20) { \
  24.        va_result = * (type *) &va_stack; \
  25.        (pvar) = 20 + ( (sizeof(type) + 7) & ~7); \
  26.     } \
  27.     else if (sizeof(type) == 8) { \
  28.        union {double d; int i[2];} u; \
  29.        u.i[0] = *(int *) (va_regs.regs + (pvar)); \
  30.        u.i[1] = *(int *) (va_regs.regs + (pvar) + 4); \
  31.        va_result = * (type *) &u; \
  32.        (pvar) += (sizeof(type) + 3) & ~3; \
  33.     } \
  34.     else { \
  35.        va_result = * (type *) (va_regs.regs + (pvar)); \
  36.        (pvar) += (sizeof(type) + 3) & ~3; \
  37.     } \
  38.     va_result; })
  39.